package com.xjl.javacore.code.reference;

import java.lang.ref.PhantomReference;
import java.lang.ref.Reference;
import java.lang.ref.ReferenceQueue;

/**
 * 强引用、软引用、弱引用、幻象引用有什么区别？具体使用场景是什么？
 *
 * @author xiaojinlu1990@163.com
 * date 2020-01-17
 */
public class Example {

        /**
        * 当进行垃圾回收时会阻塞应用，so要尽量减少垃圾回收
        * @author xiaojinlu
        */
        public static void exmaple() {
            Object counter = new Object();
            ReferenceQueue refQueue = new ReferenceQueue<>();
            PhantomReference<Object> p = new PhantomReference<>(counter, refQueue);
            counter = null;
            System.gc();
            try {
                // Remove是一个阻塞方法，可以指定timeout，或者选择一直阻塞
                Reference<Object> ref = refQueue.remove(1000L);
                if (ref != null) {
                // do something
                }
                } catch (InterruptedException e) {
                // Handle it
                }
        }
}
